// app.js
App({
  globalData: {
    userInfo: null,
    hasLogin: false,
    openid: null,
    sessionKey: null,
    token: null,
    // 开发环境和生产环境的API地址配置
    apiBaseUrl: 'http://localhost:8099' // 直接设置默认值
  },

  onLaunch() {
    console.log('小程序启动')
    // 初始化API地址配置
    this.initApiConfig()
    // 检查本地存储的登录状态
    this.checkLoginStatus()
  },

  /**
   * 初始化API配置
   */
  initApiConfig() {
    // 可以根据实际情况修改
    const isDev = true // 开发环境标志，可以通过其他方式判断
    this.globalData.apiBaseUrl = isDev ? 'http://localhost:8099' : 'https://your-production-api.com'
    console.log('API基础地址:', this.globalData.apiBaseUrl)
  },

  onShow() {
    console.log('小程序显示')
  },

  onHide() {
    console.log('小程序隐藏')
  },

  /**
   * 检查登录状态
   */
  checkLoginStatus() {
    try {
      const userInfo = wx.getStorageSync('userInfo')
      const hasLogin = wx.getStorageSync('hasLogin')
      
      if (userInfo && hasLogin) {
        this.globalData.userInfo = userInfo
        this.globalData.hasLogin = true
        console.log('用户已登录:', userInfo)
      }
    } catch (error) {
      console.error('检查登录状态失败:', error)
    }
  },

  /**
   * 保存登录状态到本地存储
   */
  saveLoginStatus(userInfo) {
    try {
      wx.setStorageSync('userInfo', userInfo)
      wx.setStorageSync('hasLogin', true)
      this.globalData.userInfo = userInfo
      this.globalData.hasLogin = true
      console.log('登录状态已保存')
    } catch (error) {
      console.error('保存登录状态失败:', error)
    }
  },

  saveToken(token) {
    try {
      wx.setStorageSync('token', token)
      this.globalData.token = token
    } catch (e) {
      console.error('保存token失败:', e)
    }
  },

  /**
   * 清除登录状态
   */
  clearLoginStatus() {
    try {
      // 清除本地存储
      wx.removeStorageSync('userInfo')
      wx.removeStorageSync('hasLogin')
      wx.removeStorageSync('token')
      
      // 重置全局数据
      this.globalData.userInfo = null
      this.globalData.hasLogin = false
      this.globalData.token = null
      this.globalData.openid = null
      this.globalData.sessionKey = null
      
      console.log('登录状态已完全清除')
    } catch (error) {
      console.error('清除登录状态失败:', error)
    }
  },

  /**
   * 获取用户登录状态
   */
  getLoginStatus() {
    return {
      hasLogin: this.globalData.hasLogin,
      userInfo: this.globalData.userInfo
    }
  },

  /**
   * 统一请求封装（自动拼接 baseUrl、携带 token、打印关键日志）
   */
  request({ url, method = 'GET', data = {}, header = {}, timeout = 10000 }) {
    const fullUrl = url.startsWith('http') ? url : `${this.globalData.apiBaseUrl}${url}`
    const headers = Object.assign({ 'Content-Type': 'application/json' }, header)
    if (this.globalData.token) headers['Authorization'] = `Bearer ${this.globalData.token}`
    
    return new Promise((resolve, reject) => {
      wx.request({
        url: fullUrl,
        method,
        data,
        timeout,
        header: headers,
        success: (res) => {
          console.log('[request] success', method, fullUrl, 'status=', res.statusCode, res.data)
          
          // 检查HTTP状态码
          if (res.statusCode >= 200 && res.statusCode < 300) {
            resolve(res)
          } else {
            // HTTP错误状态码处理
            const errorMsg = this.getHttpErrorMessage(res.statusCode, res.data)
            console.error('[request] HTTP error', res.statusCode, errorMsg)
            reject({
              type: 'http_error',
              statusCode: res.statusCode,
              message: errorMsg,
              data: res.data
            })
          }
        },
        fail: (err) => {
          console.error('[request] fail', method, fullUrl, err)
          
          // 网络错误处理
          const errorMsg = this.getNetworkErrorMessage(err)
          reject({
            type: 'network_error',
            message: errorMsg,
            original: err
          })
        }
      })
    })
  },

  /**
   * 获取HTTP错误消息
   */
  getHttpErrorMessage(statusCode, data) {
    const errorMessages = {
      400: '请求参数错误',
      401: '未授权，请重新登录',
      403: '权限不足',
      404: '请求的资源不存在',
      405: '请求方法不允许',
      408: '请求超时',
      409: '资源冲突（用户可能已存在）',
      500: '服务器内部错误',
      502: '网关错误',
      503: '服务暂时不可用',
      504: '网关超时'
    }

    // 优先使用服务器返回的错误消息
    if (data && typeof data === 'object') {
      if (data.message) return data.message
      if (data.msg) return data.msg
      if (data.error) return data.error
    }

    // 使用预定义的错误消息
    return errorMessages[statusCode] || `请求失败 (${statusCode})`
  },

  /**
   * 获取网络错误消息
   */
  getNetworkErrorMessage(error) {
    if (!error || !error.errMsg) {
      return '网络连接异常'
    }

    const errMsg = error.errMsg.toLowerCase()
    
    if (errMsg.includes('timeout')) {
      return '请求超时，请检查网络连接'
    } else if (errMsg.includes('fail')) {
      return '网络请求失败，请稍后重试'
    } else if (errMsg.includes('abort')) {
      return '请求被中断'
    } else {
      return '网络连接异常'
    }
  }
})
